import axios from 'axios'
import type { AxiosRequestConfig, AxiosResponse } from 'axios'
import { Session } from '@/utils/storage'
import { useMessageBox } from '../hooks/message'
import * as CryptoJS from 'crypto-js'
import qs from 'qs'
/**
 * 创建并配置一个 Axios 实例对象
 */
const service = axios.create({
  baseURL: '/api',
  // headers: {
  //   'Content-Type': 'application/json',
  // },
  timeout: 50000, // 全局超时时间
  paramsSerializer: {
    serialize: (params: any) => {
      return qs.stringify(params, { arrayFormat: 'repeat' })
    },
  },
})

/**
 * Axios请求拦截器，对请求进行处理
 * 1. 序列化get请求参数
 * 2. 统一增加Authorization和TENANT-ID请求头
 * 3. 自动适配单体、微服务架构不同的URL
 * @param config AxiosRequestConfig对象，包含请求配置信息
 */
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // console.log('请求url', config.url, Session.getToken())
    // 统一增加Authorization请求头,
    const token = Session.getToken()
    if (token && !config.headers?.skipToken) {
      config.headers![CommonHeaderEnum.AUTHORIZATION] = `Bearer ${token}`
    }

    //如果不是跳过skipToken，那么token不存在，则报错
    // 对于爬取导航网站的接口（/daohang-plus-ui/crawler/xxx），不要求必须登录
    // if (
    //   !config.headers?.skipToken &&
    //   !token &&
    //   !(config.url && config.url.startsWith('/daohang-plus-ui/crawler/'))
    // ) {
    //   return Promise.reject('token不存在')
    // }

    // 请求报文加密
    if (config.headers![CommonHeaderEnum.ENC_FLAG]) {
      console.log('请求报文加密')
      const key = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_PWD_ENC_KEY)
      // 加密
      const encrypted = CryptoJS.AES.encrypt(JSON.stringify(config.data), key, {
        iv: key,
        mode: CryptoJS.mode.CFB,
        padding: CryptoJS.pad.NoPadding,
      })
      const enc = encrypted.toString()
      config.data = {
        encryption: enc,
      }
    }

    // 处理完毕，返回config对象
    return config
  },
  (error) => {
    // 对请求错误进行处理
    return Promise.reject(error)
  },
)

/**
 * 响应拦截器处理函数
 * @param response 响应结果
 * @returns 如果响应成功，则返回响应的data属性；否则，抛出错误或者执行其他操作
 */
const handleResponse = (response: AxiosResponse<any>) => {
  if (response.data.code === 1) {
    throw response.data
  }
  // 针对密文返回解密
  if (response.data.encryption) {
    console.log('针对密文返回解密')
    const key = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_PWD_ENC_KEY)
    const decryptd = CryptoJS.AES.decrypt(response.data.encryption, key, {
      iv: key,
      mode: CryptoJS.mode.CFB,
      padding: CryptoJS.pad.NoPadding,
    })

    response.data = JSON.parse(decryptd.toString(CryptoJS.enc.Utf8))
    return response.data
  }
  // console.log('查询后台数据经过handleResponse：', response.data)
  return response.data
}

/**
 * 添加 Axios 的响应拦截器，用于全局响应结果处理
 */
service.interceptors.response.use(handleResponse, (error) => {
  console.log('handleResponse 异常', error)
  const status = Number(error.response.status) || 200
  if (status === 424) {
    useMessageBox()
      .confirm('令牌状态已过期，请点击重新登录')
      .then(() => {
        Session.clear() // 清除浏览器全部临时缓存
        window.location.href = '/login' // 去登录页
        return
      })
  }
  return Promise.reject(error.response.data)
})

// 常用header
export enum CommonHeaderEnum {
  'TENANT_ID' = 'TENANT-ID',
  'ENC_FLAG' = 'Enc-Flag',
  'AUTHORIZATION' = 'Authorization',
}

// 导出 axios 实例
export default service
